﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PGI.EN.Producto;
using PGI.LN.Producto;
using PGI.EN.Categoria;
using PGI.LN.Categoria;

namespace PGI.WF
{
    public partial class FrmProductoInsertar : Form
    {
        public ProductoEn prodObj = null;
        public int EstadoForm = 0;

        public static int nodoSeleccionado = -1;
        public static string nodoSeleccionadoTxt = "";

        public FrmProductoInsertar()
        {
            InitializeComponent();
        }

        private void FrmProductoInsertar_Load(object sender, EventArgs e)
        {
            List<OpcionProductoEn> Marcas = new List<OpcionProductoEn>();

            Marcas = OpcionProductoLn.ConsultaOpcionProducto(1);

            cbMarca.DataSource = Marcas;
            cbMarca.DisplayMember = "Descripcion";
            cbMarca.ValueMember = "OpcionId";

            
            List<CategoriaEn> lstCategorias = CategoriaLn.Categorias_Padres();
            LlenarTreeView();
            trvCategoria.ExpandAll();

            //List<TallaEn> tallasEn = ProductoLn.SeleccionarTallas();

            //cbxTalla.DisplayMember = "Descripcion";
            //cbxTalla.ValueMember = "TallaID";
            //cbxTalla.DataSource = tallasEn;

            
            gbProductoIns.Visible = true;
            gbTreeCategoria.Visible = false;
            //this.cbxCategoria.DisplayMember = "Text";
            //this.cbxCategoria.ValueMember = "Value";

            if (EstadoForm == 1)        // Agregar
            {
                this.Text = "Producto: Agregar";

                btnAgregar.Width = 120;
                btnAgregar.Image = imglstAgregar.Images[0];
                btnAgregar.Text = "Agregar (Enter)";
            }
            if (EstadoForm == 2)        // Ver
            {
                this.Text = "Producto: Ver";

                txtProductoID.Text = prodObj.ProductoID.ToString();
                txtCategoria.Text = prodObj.CategoriaDes.ToString();
                txtCodigo.Text = prodObj.Codigo.ToString();
                txtDescripcion.Text = prodObj.Descripcion;
                //cbxTalla.SelectedValue = prodObj.TallaID;
                txtCodBarras.Text = prodObj.CodBarra;
                txtStockMin.Text = prodObj.StockMinimo.ToString();

                txtCategoria.Enabled = true;
                txtProductoID.ReadOnly = true;
                txtCodigo.ReadOnly = true;
                txtDescripcion.ReadOnly = true;
                //cbxTalla.Enabled = false;
                txtCodBarras.ReadOnly = true;
                txtStockMin.ReadOnly = true;                    

                btnAgregar.Visible = false;
            }
            if (EstadoForm == 3)        // Editar
            {
                this.Text = "Producto: Editar";

                nodoSeleccionado = prodObj.CategoriaID;

                txtProductoID.Text = prodObj.ProductoID.ToString();
                txtCategoria.Text = prodObj.CategoriaDes.ToString();
                txtCodigo.Text = prodObj.Codigo.ToString();
                txtDescripcion.Text = prodObj.Descripcion;
                //cbxTalla.SelectedValue = prodObj.TallaID;
                txtCodBarras.Text = prodObj.CodBarra;
                txtStockMin.Text = prodObj.StockMinimo.ToString();

                txtProductoID.ReadOnly = true;

                btnAgregar.Width = 120;
                btnAgregar.Image = imglstAgregar.Images[1];
                btnAgregar.Text = "Editar (Enter)";
            }
            if (EstadoForm == 4)         //Viene de Mantenimiento Inventario para crear un producto nuevo partiendo del código de barras
            {
                this.Text = "Producto: Agregar";
                txtCodBarras.Text = prodObj.CodBarra;
                txtCodBarras.Enabled = false;

                btnAgregar.Width = 120;
                btnAgregar.Image = imglstAgregar.Images[0];
                btnAgregar.Text = "Agregar (Enter)";
            }
        }

        private void LlenarTreeView()
        {
            List<CategoriaEn> lstCategorias = CategoriaLn.Categorias_Padres();

            LlenarNodo(lstCategorias, null);
        }
        private void LlenarNodo(List<CategoriaEn> ItemsCat, TreeNode nodocat)
        {
            int raizID = nodocat != null
                ? (int)nodocat.Tag
                : 0;

            TreeNodeCollection nodoColeccion = nodocat != null
                ? nodocat.Nodes
                : trvCategoria.Nodes;

            foreach (var item in ItemsCat.Where(i => i.SubCategoriaID == raizID))
            {
                TreeNode nuevoNodo = nodoColeccion.Add(item.CategoriaID.ToString(), item.Descripcion);
                nuevoNodo.Tag = item.CategoriaID;

                LlenarNodo(ItemsCat, nuevoNodo);
            }
        }

        private void txtCategoria_MouseClick(object sender, MouseEventArgs e)
        {
            if (EstadoForm != 2)
            {
                gbProductoIns.Visible = false;
                gbTreeCategoria.Visible = true;
            }
        }

        private void trvCategoria_AfterSelect(object sender, TreeViewEventArgs e)
        {
            nodoSeleccionado = Convert.ToInt32(e.Node.Name);
            nodoSeleccionadoTxt = e.Node.Text;
        }

        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            if (nodoSeleccionado != -1)
            {
                if (nodoSeleccionado != 1)
                {
                    txtCategoria.Text = nodoSeleccionadoTxt;
                    gbProductoIns.Visible = true;
                    gbTreeCategoria.Visible = false;
                }
                else
                    MessageBox.Show(this, "No se puede seleccionar la categoría general.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                MessageBox.Show(this, "Debe seleccionar una categoria.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FrmProductoInsertar_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnAgregar_Click(sender, e);
            }
            if (e.KeyCode == Keys.Escape)
            {
                this.Dispose();
            }
            if (e.KeyCode == Keys.F2)
            {
                btnSiguiente_Click(sender, e);
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            if (validaControles() == true)
            {
                int usuarioID = 1;

                if (EstadoForm == 1  || EstadoForm == 4)
                {
                    DialogResult dr = MessageBox.Show(this, "¿Desea agregar el nuevo producto: " + txtDescripcion.Text + "?", "Pregunta:", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (dr == DialogResult.Yes)
                    {
                        ProductoEn InsProdEn = new ProductoEn();

                        InsProdEn.CategoriaID = nodoSeleccionado;
                        InsProdEn.Codigo = txtCodigo.Text;
                        InsProdEn.Descripcion = txtDescripcion.Text;                        
                        InsProdEn.CodBarra = txtCodBarras.Text;
                        InsProdEn.StockMinimo = Convert.ToInt32(txtStockMin.Text);
                        InsProdEn.MarcaID = Convert.ToInt32(cbMarca.SelectedValue);
                        InsProdEn.UsuarioID = usuarioID;

                        try
                        {
                            int resulins = ProductoLn.InsertarProducto(InsProdEn);

                            if (resulins > 0)
                                MessageBox.Show(this, "Se insertó correctamente el producto: " + txtDescripcion.Text, "INFORMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            else
                                MessageBox.Show(this, "Se presentó un problema al insertar el producto: " + txtDescripcion.Text, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);

                            this.Dispose();
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                    }
                }
                else
                {
                    DialogResult dr = MessageBox.Show(this, "¿Desea editar el producto: " + txtDescripcion.Text + "?", "Pregunta:", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (dr == DialogResult.Yes)
                    {
                        ProductoEn InsProdEn = new ProductoEn();

                        InsProdEn.ProductoID = Convert.ToInt32(txtProductoID.Text);
                        InsProdEn.CategoriaID = nodoSeleccionado;
                        InsProdEn.Codigo = txtCodigo.Text;
                        InsProdEn.Descripcion = txtDescripcion.Text;                        
                        InsProdEn.CodBarra = txtCodBarras.Text;
                        InsProdEn.StockMinimo = Convert.ToInt32(txtStockMin.Text);
                        InsProdEn.UsuarioID = usuarioID;

                        try
                        {
                            int resulins = ProductoLn.EditarProducto(InsProdEn);

                            if (resulins > 0)
                                MessageBox.Show(this, "Se editó correctamente el producto: " + txtDescripcion.Text, "INFORMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            else
                                MessageBox.Show(this, "Se presentó un problema al editar el producto: " + txtDescripcion.Text, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);

                            this.Dispose();
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                    }
                }
            }
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show(this, "¿Desea salir de la ventana sin guardar cambios?", "Pregunta", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr == DialogResult.Yes)
                this.Dispose();
        }

        private bool validaControles()
        {
            string msj = "";

            if(txtCategoria.Text.Trim() == "")
                msj += "Debe seleccionar una categoria. \n";
            if (txtCodigo.Text.Trim() == "")
                msj += "Debe ingresar un codigo. \n";
            if (txtDescripcion.Text.Trim() == "")
                msj += "Debe ingresar una descripción del producto. \n";
            if (txtCodBarras.Text.Trim() == "")
                msj += "Debe ingresar mediante el lector el código de barras. \n";
            if (txtStockMin.Text.Trim() == "")
                msj += "Debe asignar un stock mínimo. \n";

            if (msj != "")
            {
                MessageBox.Show(this, msj, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            else
                return true;
        }

        private void FrmProductoInsertar_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!this.IsDisposed)
            {
                DialogResult dr = MessageBox.Show(this, "¿Desea salir de la ventana sin guardar cambios?", "Pregunta", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dr == DialogResult.Yes)
                {
                    nodoSeleccionado = -1;
                    nodoSeleccionadoTxt = "";
                    this.Dispose();
                }
                else
                    e.Cancel = true;
            }            
        }

        private void cbMarca_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

      

          
    }
}
